在有些狀況中,我們在一個document中需要再多存其他的json object
例如:
PUT /company/_doc/1
{
"region": "TW",
"manager": {
"age": 30,
"name": {
"first": "David",
"last": "Smith"
}
}
}
在document中,manager這個欄位本身也是儲存json格式
這樣的欄位就是object type field
object type一般比較常用的有以下幾種:
object type:
"region": "TW",
"manager.age": 30,
"manager.name.first": "David",
"manager.name.last": "Smith"
那乍看之下是沒有問題,但是如果今天換成這樣呢?
POST /employee/_doc
{
"name": "Peter",
"skill": [
{
"category": "front-end",
"level": 10,
"description": "senior"
},
{
"category": "back-end",
"level": 1,
"description": "junior"
}
]
}
我們存了一個document,今天他有包含兩個欄位name與skill
其中skill欄位是一個object type field
並且其中包含了兩個inner object,那經過扁平化後會長這樣
"skill.category": ["front-end", "back-end"],
"skill.level": [10, 1],
"skill.description": ["senior", "junior"]
有發現問題了嗎?
如果沒有的話,我們可以使用以下搜尋字句去查找
GET /employee/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"skill.level": {
"lte": 9
}
}
},
{
"match": {
"name": "Peter"
}
},
{
"match": {
"skill.category.keyword": "front-end"
}
}
]
}
}
}
看不懂沒關係,大意上是:
那應該會找不到資料吧~因為Peter的front-end有10分
但是ES會找到該筆資料,現在知道原因了嗎?
因為扁平化而導致資料失去關聯性
而為了解決這樣的問題object中的nested type可以處理這樣的類型
nested type:
"type": "nested"
在查詢時會再介紹有關nested type的部分,因為nested type需要使用不同的查詢方式~這邊有個觀念就好
明天會再介紹另一種object type: Join type